#ifndef __BEEP_MUSIC_H
#define __BEEP_MUSIC_H

#include "./BSP/BEEP/beep.h"

/* ------------------------------------- C大调音符频率定义（标准音名） ------------------------------------- */

/* 用C、D、E、F、G、A、B代表音阶，加上数字表示八度 */
/* 例如：NOTE_C4（C音第4八度）、NOTE_G5（G音第5八度） */
/* 中音区 (Middle Octave) - 标准音高 */
#define NOTE_C4 261.63f /* 中音 Do (C4) */
#define NOTE_D4 293.66f /* 中音 Re (D4) */
#define NOTE_E4 329.63f /* 中音 Mi (E4) */
#define NOTE_F4 349.23f /* 中音 Fa (F4) */
#define NOTE_G4 392.00f /* 中音 Sol (G4) */
#define NOTE_A4 440.00f /* 中音 La (A4) */
#define NOTE_B4 493.88f /* 中音 Si (B4) */
#define NOTE_Bb4 466.16f /* 降B4 */
#define NOTE_C5 523.25f /* 高音 Do (C5) */

/* 低音区 (Low Octave) - 低八度 */
#define NOTE_C3 130.81f /* 低音 Do (C3) */
#define NOTE_D3 146.83f /* 低音 Re (D3) */
#define NOTE_E3 164.81f /* 低音 Mi (E3) */
#define NOTE_F3 174.61f /* 低音 Fa (F3) */
#define NOTE_G3 196.00f /* 低音 Sol (G3) */
#define NOTE_A3 220.00f /* 低音 La (A3) */
#define NOTE_B3 246.94f /* 低音 Si (B3) */

/* 高音区 (High Octave) - 高八度 */
#define NOTE_C5 523.25f  /* 高音 Do (C5) */
#define NOTE_D5 587.33f  /* 高音 Re (D5) */
#define NOTE_E5 659.25f  /* 高音 Mi (E5) */
#define NOTE_F5 698.46f  /* 高音 Fa (F5) */
#define NOTE_G5 783.99f  /* 高音 Sol (G5) */
#define NOTE_A5 880.00f  /* 高音 La (A5) */
#define NOTE_B5 987.77f  /* 高音 Si (B5) */
#define NOTE_C6 1046.50f /* 高音 Do (C6) */
#define NOTE_D6 1174.66f /* 高音 Re (D6) */
#define NOTE_E6 1318.51f /* 高音 Mi (E6) */
#define NOTE_F6 1396.91f /* 高音 Fa (F6) */
#define NOTE_G6 1567.98f /* 高音 Sol (G6) */
#define NOTE_A6 1760.00f /* 高音 La (A6) */
#define NOTE_B6 1975.53f /* 高音 Si (B6) */

/* 超高音区 (Very High Octave) - 更高八度 */
#define NOTE_C7 2093.00f /* 超高音 Do (C7) */
#define NOTE_D7 2349.32f /* 超高音 Re (D7) */
#define NOTE_E7 2637.02f /* 超高音 Mi (E7) */
#define NOTE_F7 2793.83f /* 超高音 Fa (F7) */
#define NOTE_G7 3135.96f /* 超高音 Sol (G7) */
#define NOTE_A7 3520.00f /* 超高音 La (A7) */
#define NOTE_B7 3951.07f /* 超高音 Si (B7) */

/* 休止符 */
#define NOTE_REST 0.0f /* 休止符 (静音) */

/* -------------------------------------------- 西式唱名别名 ---------------------------------------------- */

/* 用Do、Re、Mi、Fa、Sol、La、Si代表音阶，加上数字表示八度 */
/* 例如：NOTE_DO4（Do音第4八度）、NOTE_SOL5（Sol音第5八度） */
/* 中音区 */
#define NOTE_DO4 NOTE_C4  /* 中音 Do */
#define NOTE_RE4 NOTE_D4  /* 中音 Re */
#define NOTE_MI4 NOTE_E4  /* 中音 Mi */
#define NOTE_FA4 NOTE_F4  /* 中音 Fa */
#define NOTE_SOL4 NOTE_G4 /* 中音 Sol */
#define NOTE_LA4 NOTE_A4  /* 中音 La */
#define NOTE_SI4 NOTE_B4  /* 中音 Si */

/* 低音区 */
#define NOTE_DO3 NOTE_C3  /* 低音 Do */
#define NOTE_RE3 NOTE_D3  /* 低音 Re */
#define NOTE_MI3 NOTE_E3  /* 低音 Mi */
#define NOTE_FA3 NOTE_F3  /* 低音 Fa */
#define NOTE_SOL3 NOTE_G3 /* 低音 Sol */
#define NOTE_LA3 NOTE_A3  /* 低音 La */
#define NOTE_SI3 NOTE_B3  /* 低音 Si */

/* 高音区 */
#define NOTE_DO5 NOTE_C5  /* 高音 Do */
#define NOTE_RE5 NOTE_D5  /* 高音 Re */
#define NOTE_MI5 NOTE_E5  /* 高音 Mi */
#define NOTE_FA5 NOTE_F5  /* 高音 Fa */
#define NOTE_SOL5 NOTE_G5 /* 高音 Sol */
#define NOTE_LA5 NOTE_A5  /* 高音 La */
#define NOTE_SI5 NOTE_B5  /* 高音 Si */

/* -------------------------------------------- 中国式简谱别名 -------------------------------------------- */

/* 用数字1-7代表音阶，加上L（低音）、M（中音）、H（高音）前缀 */
/* 例如：L1（低音Do）、M5（中音Sol）、H1（高音Do） */
/* 低音区 */
#define L1 NOTE_C4   /* 低音Do */
#define L2 NOTE_D4   /* 低音Re */
#define L3 NOTE_E4   /* 低音Mi */
#define L4 NOTE_F4   /* 低音Fa */
#define L5 NOTE_G4   /* 低音Sol */
#define L6 NOTE_A4   /* 低音La */
#define L7 NOTE_B4   /* 低音Si */

/* 中音区 */
#define M1 NOTE_C5   /* 中音Do */
#define M2 NOTE_D5   /* 中音Re */
#define M3 NOTE_E5   /* 中音Mi */
#define M4 NOTE_F5   /* 中音Fa */
#define M5 NOTE_G5   /* 中音Sol */
#define M6 NOTE_A5   /* 中音La */
#define M7 NOTE_B5   /* 中音Si */

/* 高音区 */
#define H1 NOTE_C6   /* 高音Do */
#define H2 NOTE_D6   /* 高音Re */
#define H3 NOTE_E6   /* 高音Mi */
#define H4 NOTE_F6   /* 高音Fa */
#define H5 NOTE_G6   /* 高音Sol */
#define H6 NOTE_A6   /* 高音La */
#define H7 NOTE_B6   /* 高音Si */

/* 休止符 */
#define Z0 NOTE_REST /* 休止符 */

/* -------------------------------------------- 音乐理论常量 ---------------------------------------------- */

/* 音程关系 (频率比值) */
#define INTERVAL_OCTAVE 2.0f           /* 八度音程 (频率翻倍) */
#define INTERVAL_FIFTH 1.5f            /* 纯五度 */
#define INTERVAL_FOURTH 1.33333f       /* 纯四度 */
#define INTERVAL_MAJOR_THIRD 1.25f     /* 大三度 */
#define INTERVAL_MINOR_THIRD 1.2f      /* 小三度 */
#define INTERVAL_MAJOR_SECOND 1.125f   /* 大二度 */
#define INTERVAL_MINOR_SECOND 1.05946f /* 小二度 (半音) */

/* 标准音高 */
#define A4_STANDARD 440.0f  /* 标准音高 A4 (440Hz) */
#define C4_STANDARD 261.63f /* 标准音高 C4 (261.63Hz) */

/* 音程名称 */
typedef enum
{
    INTERVAL_UNISON = 0,          /* 同度 */
    INTERVAL_MINOR_SECOND_ENUM,   /* 小二度 */
    INTERVAL_MAJOR_SECOND_ENUM,   /* 大二度 */
    INTERVAL_MINOR_THIRD_ENUM,    /* 小三度 */
    INTERVAL_MAJOR_THIRD_ENUM,    /* 大三度 */
    INTERVAL_PERFECT_FOURTH_ENUM, /* 纯四度 */
    INTERVAL_TRITONE_ENUM,        /* 增四度/减五度 */
    INTERVAL_PERFECT_FIFTH_ENUM,  /* 纯五度 */
    INTERVAL_MINOR_SIXTH_ENUM,    /* 小六度 */
    INTERVAL_MAJOR_SIXTH_ENUM,    /* 大六度 */
    INTERVAL_MINOR_SEVENTH_ENUM,  /* 小七度 */
    INTERVAL_MAJOR_SEVENTH_ENUM,  /* 大七度 */
    INTERVAL_OCTAVE_8VA_ENUM      /* 八度 */
} music_interval_t;

/* -------------------------------------------- 音符结构体定义 -------------------------------------------- */

/**
 * @brief       音符结构体
 * @note        用于定义单个音符的频率和持续时间
 */
typedef struct
{
    float frequency;    /* 音符频率 (Hz) */
    uint16_t duration;  /* 持续时间 (毫秒) */
} music_note_t;

/**
 * @brief       音乐片段结构体
 * @note        用于定义一段音乐的音符序列
 */
typedef struct
{
    const music_note_t *notes; /* 音符数组指针 */
    uint16_t note_count;       /* 音符数量 */
    uint8_t tempo;             /* 速度 (BPM) */
    uint8_t volume;            /* 音量 (0-100) */
} music_melody_t;

/* --------------------------------------------------- 函数声明 ------------------------------------------- */

/* 基础音乐函数 */
void beep_play_note(float freq, uint16_t duration);                 /* 播放单个音符 */
void beep_play_melody(const music_note_t *notes, uint16_t count);   /* 播放音符序列 */
void beep_play_music(const music_melody_t *melody);                 /* 播放音乐片段 */

/* 音乐理论函数 */
float beep_calculate_note_freq(uint8_t octave, uint8_t note);               /* 计算音符频率 */
float beep_calculate_interval(float base_freq, music_interval_t interval);  /* 计算音程频率 */

/* 音乐测试函数 */
void beep_music_test_scale(void);       /* 测试音阶 */
void beep_music_test_chord(void);       /* 测试和弦 */
void beep_music_test_interval(void);    /* 测试音程 */

#endif
